package com.yupi.springbootinit.statemachine.enums;

/**
 * 角色枚举
 * 定义制造业订单管理系统中的六种角色
 */
public enum RoleEnum {
    
    /**
     * 管理员
     * 全局配置、用户与角色、基础数据（工序库/料粉/机型等）
     * 全量可见与操作（含跨部门查看全部订单状态与明细）
     */
    ADMIN("ADMIN", "管理员"),
    
    /**
     * 项目部用户
     * 发起销售订单，上传合同附件
     * 查看全部销售订单的整体状态与节点流转（只读），可查看关联工艺/排期/工序进度的只读信息
     */
    PROJECT_DEPT("PROJECT_DEPT", "项目部"),
    
    /**
     * 工程部用户
     * 接收"创建工艺单"待办，创建/维护工艺单（路线、外协标记、检验要求、文件）
     * 查看与本部门相关的订单/工艺/工序信息
     */
    ENGINEERING_DEPT("ENGINEERING_DEPT", "工程部"),
    
    /**
     * PMC用户
     * 接收"创建生产排期"待办，维护工序预计完成日期，发布排期、调整排期
     * 查看资源负荷、在制进度
     */
    PMC("PMC", "PMC"),
    
    /**
     * 生产部用户
     * 接收工序执行待办；工序完成时的手动报工；填写实际参数/备注
     */
    PRODUCTION_DEPT("PRODUCTION_DEPT", "生产部"),
    
    /**
     * 品质部用户
     * 接收工序检验待办；开检、录入检验结果、生成检验报告；合格/不合格判定
     */
    QUALITY_DEPT("QUALITY_DEPT", "品质部");
    
    private final String code;
    private final String description;
    
    RoleEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }
    
    public String getCode() {
        return code;
    }
    
    public String getDescription() {
        return description;
    }
    
    /**
     * 根据代码获取角色枚举
     */
    public static RoleEnum getByCode(String code) {
        for (RoleEnum role : values()) {
            if (role.getCode().equals(code)) {
                return role;
            }
        }
        return null;
    }
    
    /**
     * 检查是否为管理员角色
     */
    public boolean isAdmin() {
        return this == ADMIN;
    }
    
    /**
     * 检查是否为项目部角色
     */
    public boolean isProjectDept() {
        return this == PROJECT_DEPT;
    }
    
    /**
     * 检查是否为工程部角色
     */
    public boolean isEngineeringDept() {
        return this == ENGINEERING_DEPT;
    }
    
    /**
     * 检查是否为PMC角色
     */
    public boolean isPMC() {
        return this == PMC;
    }
    
    /**
     * 检查是否为生产部角色
     */
    public boolean isProductionDept() {
        return this == PRODUCTION_DEPT;
    }
    
    /**
     * 检查是否为品质部角色
     */
    public boolean isQualityDept() {
        return this == QUALITY_DEPT;
    }
}